/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ui;

import edu.ucue.ptc.gco.mdl.Cliente;
import edu.ucue.ptc.gco.mdl.DetallePedido;
import edu.ucue.ptc.gco.mdl.Direccion;
import edu.ucue.ptc.gco.mdl.Lote;
import edu.ucue.ptc.gco.mdl.Pedido;
import edu.ucue.ptc.gco.mdl.Producto;
import edu.ucue.ptc.gco.ngc.ClienteManagerLocal;
import edu.ucue.ptc.gco.ngc.DetallePedidoManagerLocal;
import edu.ucue.ptc.gco.ngc.DireccionManagerLocal;
import edu.ucue.ptc.gco.ngc.PedidoManagerLocal;
import edu.ucue.ptc.gco.ngc.ProductoManagerLocal;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.DireccionValidadorException;
import edu.ucue.ptc.gco.util.InsuficienteStockException;
import edu.ucue.ptc.gco.util.PedidoException;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Xaferima
 */
@Named(value = "pedidoAction")
@SessionScoped
public class PedidoAction implements Serializable {

    @Inject
    private PedidoManagerLocal pedidoManager;
    private Pedido pedido;
    private String cedulaRuc;
    private Producto productoSel;
    private int cantidad;
    private boolean modoModificar = false;
    private List<Direccion> listaDirecciones;
    @Inject
    private DetallePedidoManagerLocal detallePedidoManager;
    @Inject
    private ProductoManagerLocal productoManager;
    @Inject
    private ClienteManagerLocal clienteManager;
    @Inject
    private DireccionManagerLocal direccionManager;
    private Direccion direccionSel;
    private List<DetallePedido> listaDetallePedido;
    private List<Pedido> listaPedidos;

    public List<Pedido> getListaPedidos() {
        return listaPedidos;
    }

    public void setListaPedidos(List<Pedido> listaPedidos) {
        this.listaPedidos = listaPedidos;
    }

    public PedidoAction() {
    }

    public static PedidoAction getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{pedidoAction}", PedidoAction.class);
        return (PedidoAction) ex.getValue(context);
    }

    public String agregarProducto() {
        try {
            for (DetallePedido detalle : listaDetallePedido) {
                if (detalle.getProducto().getIdProducto() == productoSel.getIdProducto()) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "El producto ya existe en la lista"));
                    return "";
                }
            }

            productoSel = productoManager.obtenerPorId(productoSel.getIdProducto(), LoginAction.getUsername(), LoginAction.getPassword());
            List<Lote> lotesParaProducto = productoManager.lotesProducto(cantidad, productoSel.getIdProducto(), LoginAction.getUsername(), LoginAction.getPassword());

            for (Lote lot : lotesParaProducto) {
                DetallePedido detallePedidoSub = new DetallePedido();
                detallePedidoSub.setCantidad(lot.getCantidadTomada());
                detallePedidoSub.setPedido(pedido);
                detallePedidoSub.setProducto(productoSel);
                detallePedidoSub.setPrecio(lot.getCostoVenta());
                detallePedidoSub.setFechaCaducidad(lot.getFechaCaducidad());
                
                listaDetallePedido.add(detallePedidoSub);
            }

            RequestContext.getCurrentInstance().update(":tablaDetPed");
        } catch (AtributoInvalidoException ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InsuficienteStockException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Stock insuficiente"));
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "";
    }

    public String quitarDeLista(DetallePedido detped) {
        listaDetallePedido.remove(detped);
        RequestContext.getCurrentInstance().update(":tablaDetPed");
        return "";
    }

    @PostConstruct
    public void init() {
        pedido = new Pedido();
        listaDetallePedido = new ArrayList<DetallePedido>();
        try {
            listaDirecciones = direccionManager.listarTodos(LoginAction.getUsername(),LoginAction.getPassword());
            cargaLista();
        } catch (DireccionValidadorException ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch(AtributoInvalidoException ae){
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ae);
        }
    }

    public String guardar() {
        try {
            if (!modoModificar) {
                Cliente clienteBuscado = clienteManager.buscarPorCedula(cedulaRuc,LoginAction.getUsername(), LoginAction.getPassword());
              if (clienteBuscado == null) {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "No existe un cliente con la cédula indicada"));
                    return "";
                }
                pedido.setDetalle(listaDetallePedido);
                pedido.setCliente(clienteBuscado);
                pedido.setDireccion(direccionSel);
                pedidoManager.crear(pedido, LoginAction.getUsername(), LoginAction.getPassword());
                addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "AÑADIR PEDIDO", "PEDIDO CREADO CORRECTAMENTE")); 
            }
            else
            {
                pedidoManager.actualizar(pedido, LoginAction.getUsername(), LoginAction.getPassword());
            }            
            RequestContext.getCurrentInstance().update("tablaPedido");
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Guardado"));
            return "listaPedidos";    
            
            
            
            
        } catch (AtributoInvalidoException ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InsuficienteStockException ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (PedidoException ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(PedidoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }

    
     public void cargaLista() {
        try {
            listaPedidos = pedidoManager.listarTodos(LoginAction.getUsername(), LoginAction.getPassword());
        } catch (Exception ex) {
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
     
     public String modificar(Pedido pedidoMod) {
       modoModificar = true;
       setModoModificar(true);
       pedido = pedidoMod;
       return "pedido";
    }
     
     
    public String cancel() {
        return "index";
    }

        public boolean isModoModificar() {
        return modoModificar;
    }

    public void setModoModificar(boolean modoModificar) {
        this.modoModificar = modoModificar;
    }
    
    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public String getCedulaRuc() {
        return cedulaRuc;
    }

    public void setCedulaRuc(String cedulaRuc) {
        this.cedulaRuc = cedulaRuc;
    }
    
    public void addMessage(FacesMessage message) {  
        FacesContext.getCurrentInstance().addMessage(null, message);  
    }

    public Producto getProductoSel() {
        return productoSel;
    }

    public void setProductoSel(Producto productoSel) {
        this.productoSel = productoSel;
    }

    public List<DetallePedido> getListaDetalleProducto() {
        return listaDetallePedido;
    }

    public void setListaDetalleProducto(List<DetallePedido> listaDetalleProducto) {
        this.listaDetallePedido = listaDetalleProducto;
    }

    public int getCantidad() {
        return cantidad;
    }

    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    public Direccion getDireccionSel() {
        return direccionSel;
    }

    public void setDireccionSel(Direccion direccionSel) {
        this.direccionSel = direccionSel;
    }

    public List<Direccion> getListaDirecciones() {
        return listaDirecciones;
    }

    public void setListaDirecciones(List<Direccion> listaDirecciones) {
        this.listaDirecciones = listaDirecciones;
    }
    
}
